查找对应函数时用法时可以直接 Ctrl/Command + F
Unity 内置辅助方法
顶点变换函数 (in UnityCG.cginc)
函数名 | 使用说明 |
---|---|
float4 UnityObjectToClipPos(float3 pos) | 将点从对象空间转换为相机 齐次坐标下的剪辑空间。这相当于mul(UNITY_MATRIX_MVP,float4(pos,1.0))。 |
float3 UnityObjectToViewPos(float3 pos) | 将点从对象空间转换为视图空间。这相当于mul(UNITY_MATRIX_MV,float4(pos,1.0)).xyz。 |
通用辅助函数 (in UnityCG.cginc)
函数名 | 使用说明 |
---|---|
float3 WorldSpaceViewDir (float4 v) | 返回从给定对象空间顶点位置到摄像机的世界空间方向(未归一化)。 |
float3 ObjSpaceViewDir (float4 v) | 返回从给定对象空间顶点位置到相机的对象空间方向(未归一化)。 |
float2 ParallaxOffset (half h, half height, half3 viewDir) | 计算视差法线映射的UV偏移。可参考文章 可以理解成针对摄像机角度做了处理的凹凸效果。 |
fixed Luminance (fixed3 c) | 将颜色转换为亮度(灰度)。 |
fixed3 DecodeLightmap (fixed4 color) | 从Unity光照贴图解码颜色(基于平台为RGBM 或dLDR) |
float4 EncodeFloatRGBA (float v) | 为储存低精度的渲染目标,编码[0..1)范围的浮点数到RGBA颜色。 |
float DecodeFloatRGBA (float4 enc) | 解码RGBA颜色到float。 |
float2 EncodeFloatRG (float v) | 编码到RG通道 |
float DecodeFloatRG (float2 enc) | 从RG通道解码到浮点数 |
float2 EncodeViewNormalStereo (float3 n) | 编码视图空间法线到在0到1范围的两个数。 |
float3 DecodeViewNormalStereo (float4 enc4) | 从enc4.xy解码视图空间法线 |
正向渲染辅助函数 (in UnityCG.cginc)
float3 WorldSpaceLightDir (float4 v) | 计算世界空间方向(非归一化),给定对象空间顶点位置。 |
---|---|
float3 ObjSpaceLightDir (float4 v) | 计算对象空间方向(非归一化),给定对象空间顶点位置。 |
float3 Shade4PointLights (…) | 从4个点光源计算亮度,来将光照数据牢固的装入向量中。正向渲染使用此来计算逐顶点光照。 |
屏幕辅助函数(in UnityCG.cginc)
float4 ComputeScreenPos (float4 clipPos) | 计算用于执行屏幕空间映射纹理采样的纹理坐标。输入是剪辑空间位置。Computes texture coordinate for doing a screenspace-mapped texture sample. Input is clip space position. |
---|---|
float4 ComputeGrabScreenPos (float4 clipPos) | 计算纹理坐标以对抓取过程纹理进行采样。输入是剪辑空间位置。Computes texture coordinate for sampling a GrabPass texure. Input is clip space position. |
顶点照明辅助函数(in UnityCG.cginc)
float3 ShadeVertexLights (float4 vertex, float3 normal) | 根据局部空间位置和法线,从4个逐顶点灯光和环境光计算亮度。 Computes illumination from four per-vertex lights and ambient, given object space position & normal. |
---|
Shader 数学函数 摘自 CSDN博文
abs(x) 返回输入参数的绝对值;
acos(x) 反余弦函数,输入参数范围[-1,1],返回[0,π]区间的角度值;
all(x) 如果输入的参数均不为0,则返回true,否则返回false;
any(x) 输入的参数只要有一个不为0,则返回true;
asin(x) 反正弦函数,输入的参数取值区间[-1,1],返回角度值范围为[-π/2,π/2];
atan(x) 反正切函数,返回角度值范围[-π/2,π/2];
atan2(y,x) 计算y/x的反正切值;
ceil(x) 对输入的参数向上取整;
clamp(x,a,b) 如果x小于a,返回a;x大于b,则返回b;否则,返回x;
cos(x) 返回x的余弦值,返回值范围[-1,1];
cosh(x) 双曲余弦函数,计算x的双曲余弦值;
cross(A,B) 返回两个三元向量的叉积,注意参数必须是三元向量;
degrees(x) 输入参数为弧度值,函数将其转换为角度值;
determinant(m) 计算矩阵的行列式因子;
dot(A,B) 返回A和B的点积,参数可以是标量,也可以是向量;
exp(x) 计算e^x的值,e=2.71828;
exp2(x) 计算2^x的值;
floor(x) 对输入的参数向下取整;
fmod(x,y) 返回x/y的余数。如果y为0,结果不可预料;
frac(x) 返回标量或者是每个向量组件的分数部分;
frexp(x,out exp) 将浮点数x分解为尾数和指数,x=m*2^exp返回m,并将指数存入exp中,如果x为0,则尾数和指数都返回0;(不是很明白?)
isfinite(x) 判断标量或者向量中的每个数据是否是无限,如果是返回true,否则返回false;
isnan(x) 判断标量或者向量中的每个数据是否是非数据,如果是返回true,否则返回false;
ldexp(x,n) 计算x*(2^n)的值;
lerp(a,b,f) 计算(1-f)a + b*f 或者 a+f(b-a)的值,即在下限a和上限b之间进行插值,f表示权值。注意,如果a和b是向量,则权值f必须是标量或者等长的向量;
lit(NdotL,NdotH,m) N表示法向量。L表示入射光向量。H表示半角向量。m表示高光向量。函数计算环境光,散射光,镜面光的贡献,返回四元向量: X表示环境光的贡献,总是1;Y表示散射光的贡献,如果N.L<0,则为0,否则为N.L; Z表示镜面光的贡献,如果N.L<0或者N.H<0,则为0;否则为(N.H)^m;W始终为1;
log(x) 计算ln(x)的值,x必须大于0;
log2(x) 计算log2^x的值,x必须大于0;
log10(x) 计算log10^x的值,x必须大于0;
max(a,b) 比较两个标量或者等长向量元素,返回最大值;
min(a,b) 比较两个标量或者等长向量元素,返回最小值;
mul(M,N) 计算两个矩阵相乘,如果M为AxB矩阵,N为BxC矩阵,则返回AxC矩阵;
mul(M,v) 计算矩阵和向量相乘;
mul(v,M) 计算向量与矩阵相乘;
noise(x) 噪声函数,返回值始终在0-1之间,对于同样的输入,返回相同的值(也就是说并不是真正意义上的随机噪声);
pow(x,y) 表示x^y;
radians(x) 函数将角度值转换成弧度值;
round(x) 四舍五入;
saturate(x) 如果x小于0,返回0;如果x大于1,返回1;否则返回x;
sign(x) 符号函数 ,如果x大于0,返回1;如果小于0,返回-1;否则返回0;
sin(x) 输入参数为弧度,计算正弦值,返回值范围[-1,1];
sincos(float x ,out s, out c) 该函数是同时计算x的sin值和cos值,其中s=sin(x),c=cos(x),这样比分开计算要快;
smoothstep(min,max,x) x位于min和max之间,若x=min,返回0;若x=max,返回1;若x在两者之间,按下列公式返回数据:-2((x-min)/(max-min))^3+3((x-min)/(max-min))^2;
step(a,x) 若x< a,返回0,否则返回1;
sqrt(x) 求x的平方根,x必须大于0;
tan(x) 输入参数为弧度,计算正切值;
tanh(x) 计算双曲正切值;
transpose(M) M为矩阵,计算其转置矩阵;
distance(pt1,pt2) 两点之间的欧几里得距离;
faceforword(N,I,Ng) 若Ng*I<0,返回N,否则返回-N;
length(v) 返回一个向量的模;
normalize(v) 归一化向量;
reflect(I,N) 根据入射光方向向量,和顶点法向量N,计算反射光方向向量,其中I和N必须被归一化,需要注意的是:这个I是指向顶点的;函数只对三元向量有效;
refract(I,N,eta) 计算折射向量,I为入射光线,N为法向量,eta为折射系数;其中I和N必须被归一化,如果I和N之间夹角太大,则返回(0,0,0),也就是没有折射光线;函数只对三元向量有效;
纹理映射函数tex1D(sampler1D tex,float s) 一维纹理查询;
tex1D(sampler1D tex, float s, float dsdx, float dsdy) 使用导数值查询一维纹理;
Tex1Dproj(sampler1D tex, float2 sq) 一维投影纹理查询;
Tex2D(sampler2D tex,float2 s) 二维查询纹理;
Tex2Dproj(sampler2D tex, float4 szq) 二维投影纹理查询;
Tex3D(sampler3D tex, float s) 三维纹理查询;
Tex3Dproj(sampler3D tex, float4 szq) 查询三维投影纹理,并进行深度值比较;
texCUBE(samplerCUBE tex, float3 s) 查询立方体纹理;
texCUBEproj (samplerCUBE tex, float4 sq) 查询立方体投影纹理;
ddx(a) 参数a对应一个像素位置,返回该像素值在X轴的偏导数;
ddy(a) 参数a对应一个像素位置,返回该像素值在X轴上的偏导数;
void debug(float4 x) 如果在编译时设置了debug,片段着色程序中调用该函数可以将值x作为COLOR语义的最终输出,否则该函数什么也不做;